// Records (记录) 示例
// 演示 Pascal 中记录的各种用法
program p_10_records;

{$mode objfpc}{$H+}
// {$mode objfpc} 启用 Object Pascal 模式
// {$H+} 启用长字符串支持（AnsiString）

// 引入单元文件
uses
  SysUtils;  // 系统工具单元，包含常用的系统函数

// 定义记录类型
type
  // 简单的学生记录
  TStudent = record
    Name: String[50];
    Age: Integer;
    Score: Real;
    IsActive: Boolean;
  end;
  
  // 复杂的人员记录（包含嵌套记录）
  TAddress = record
    Street: String[100];
    City: String[50];
    ZipCode: String[10];
  end;
  
  TPerson = record
    Name: String[50];
    Age: Integer;
    Address: TAddress;  // 嵌套记录
  end;
  
  // 点记录（用于数学计算）
  TPoint = record
    X, Y: Real;
  end;

// 计算两点间距离的函数
function Distance(P1, P2: TPoint): Real;
begin
  Distance := Sqrt(Sqr(P2.X - P1.X) + Sqr(P2.Y - P1.Y));
end;

// 显示学生信息的过程
procedure DisplayStudent(S: TStudent);
begin
  WriteLn('  姓名: ', S.Name);
  WriteLn('  年龄: ', S.Age);
  WriteLn('  分数: ', S.Score:0:1);
  WriteLn('  活动状态: ', S.IsActive);
end;

// 所有变量声明移到这里
var
  student: TStudent;
  student2: TStudent;
  person: TPerson;
  students: array[1..3] of TStudent;
  point1: TPoint;
  point2: TPoint;
  i: Integer;

// 程序主入口
begin
  WriteLn('=== Pascal 记录示例 ===');
  WriteLn;
  
  // 1. 基本记录使用
  WriteLn('1. 基本记录使用:');
  student.Name := '张三';
  student.Age := 20;
  student.Score := 85.5;
  student.IsActive := True;
  
  DisplayStudent(student);
  
  WriteLn;
  
  // 2. 记录初始化
  WriteLn('2. 记录初始化:');
  student2.Name := '李四';
  student2.Age := 19;
  student2.Score := 92.0;
  student2.IsActive := True;
  WriteLn('  学生2信息:');
  DisplayStudent(student2);
  
  WriteLn;
  
  // 3. 嵌套记录
  WriteLn('3. 嵌套记录:');
  person.Name := '王五';
  person.Age := 30;
  person.Address.Street := '中山路123号';
  person.Address.City := '北京';
  person.Address.ZipCode := '100000';
  
  WriteLn('  姓名: ', person.Name);
  WriteLn('  年龄: ', person.Age);
  WriteLn('  地址: ', person.Address.Street, ', ', person.Address.City, ' ', person.Address.ZipCode);
  
  WriteLn;
  
  // 4. 记录数组
  WriteLn('4. 记录数组:');
  // 初始化学生数组
  students[1].Name := '学生A';
  students[1].Age := 18;
  students[1].Score := 88.5;
  students[1].IsActive := True;
  
  students[2].Name := '学生B';
  students[2].Age := 19;
  students[2].Score := 91.0;
  students[2].IsActive := True;
  
  students[3].Name := '学生C';
  students[3].Age := 20;
  students[3].Score := 76.5;
  students[3].IsActive := False;
  
  // 显示所有学生信息
  for i := 1 to 3 do
  begin
    WriteLn('  学生', i, ':');
    DisplayStudent(students[i]);
    WriteLn;
  end;
  
  // 5. 记录与函数
  WriteLn('5. 记录与函数:');
  point1.X := 0.0;
  point1.Y := 0.0;
  point2.X := 3.0;
  point2.Y := 4.0;
  
  WriteLn('  点1坐标: (', point1.X:0:1, ', ', point1.Y:0:1, ')');
  WriteLn('  点2坐标: (', point2.X:0:1, ', ', point2.Y:0:1, ')');
  WriteLn('  两点间距离: ', Distance(point1, point2):0:2);
  
  WriteLn;
  WriteLn('演示了 Pascal 中记录的各种用法');
  
  // 等待用户按键，防止程序窗口立即关闭
  ReadLn;
end.